using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Web;
using BEL;
using AEL.BOD;

namespace APR
{
    public class AP_Bod_Alta : IAPR
    {
        #region Adapter
        private CEL.BOD.DO_Bod_Alta _adpBod_Alta;
        private CEL.BOD.DO_Bod_Alta adpBod_Alta
        {
            get
            {
                if (_adpBod_Alta == null)
                    _adpBod_Alta = new CEL.BOD.DO_Bod_Alta();
                return _adpBod_Alta;
            }
        }
       
        #endregion 

        #region Operaciones con Datos
        public void EmitirExcepcion(string mensaje, string caso)
        {
            Exception eCaso = new System.Exception(caso);
            Exception otroEX = new System.Exception(mensaje, eCaso);
            throw otroEX;
        }

        public bool Adelante(Scope s, object p_Objeto, string p_Proceso)
        {           
               
                Bod_Alta p_Objeto_ = (Bod_Alta)p_Objeto;
                if (p_Objeto_.Estado == "PEN" && p_Proceso == "ORD")
                {
                    try
                    {
                        adpBod_Alta.Adapter.BeginTransaction();
                        DEL.BOD.DO_Bod_Alta.Insert_Orden(s, ref p_Objeto_);
                        Bod_Alta p_Objeto_Nuevo = CopiarObjeto(p_Objeto_);
                        p_Objeto_Nuevo.Estado = p_Proceso;
                        p_Objeto_Nuevo.Fecha_Update = DateTime.Now;
                        if (Actualizar(s, p_Objeto_, p_Objeto_Nuevo))
                        {
                            p_Objeto_ = p_Objeto_Nuevo;
                        }

                        adpBod_Alta.Adapter.CommitTransaction();
                    }
                    catch 
                    {
                        adpBod_Alta.Adapter.RollbackTransaction();
                        throw;                        
                    }
                    try
                    {
                        adpBod_Alta.Adapter.BeginTransaction();
                        p_Proceso = "KAR";
                        DEL.BOD.DO_Bod_Alta.Insert_Kardex(s, ref p_Objeto_);
                        Bod_Alta p_Objeto_Actual = CopiarObjeto(p_Objeto_);
                        List<Bod_Alta> lstBodAlta= adpBod_Alta.GetById(s, p_Objeto_.Id);
                        p_Objeto_.Fecha_Update = lstBodAlta[0].Fecha_Update;
                        p_Objeto_Actual.Estado = p_Proceso;
                        p_Objeto_Actual.Fecha_Update = DateTime.Now;
                        if (Actualizar(s, p_Objeto_, p_Objeto_Actual))
                        {
                            p_Objeto_ = p_Objeto_Actual;
                        }
                        adpBod_Alta.Adapter.CommitTransaction();                            
                    }
                    catch
                    {
                        adpBod_Alta.Adapter.RollbackTransaction();
                        throw;                        
                    }
                }
                else if (p_Objeto_.Estado == "ORD" && p_Proceso == "KAR")
                {
                    try
                    {
                        adpBod_Alta.Adapter.BeginTransaction();
                        DEL.BOD.DO_Bod_Alta.Insert_Kardex(s, ref p_Objeto_);
                        Bod_Alta p_Objeto_Nuevo = CopiarObjeto(p_Objeto_);
                        p_Objeto_Nuevo.Estado = p_Proceso;
                        p_Objeto_Nuevo.Fecha_Update = DateTime.Now;
                        if (Actualizar(s, p_Objeto_, p_Objeto_Nuevo))
                        {
                            p_Objeto_ = p_Objeto_Nuevo;
                        }                          
                        adpBod_Alta.Adapter.CommitTransaction();                                          
                    }
                    catch 
                    {
                        adpBod_Alta.Adapter.RollbackTransaction();
                        throw;                        
                    }
                }              
                return true;                         
        }

        public bool Atras(Scope s, object p_Objeto, string p_Proceso)
        {
            Bod_Alta p_Objeto_ = (Bod_Alta)p_Objeto;
            if (p_Objeto_.Estado == "KAR" && p_Proceso == "ORD")
            {
                try
                {
                    adpBod_Alta.Adapter.BeginTransaction();
                    DEL.BOD.DO_Bod_Alta.Delete_Kardex(s, ref p_Objeto_);
                    Bod_Alta p_Objeto_Nuevo = CopiarObjeto(p_Objeto_);                    
                    p_Objeto_Nuevo.Estado = p_Proceso;
                    p_Objeto_Nuevo.Fecha_Update = DateTime.Now;
                    if (Actualizar(s, p_Objeto_, p_Objeto_Nuevo))
                    {
                        p_Objeto_ = p_Objeto_Nuevo;
                    }
                    adpBod_Alta.Adapter.CommitTransaction();
                }
                catch 
                {
                    adpBod_Alta.Adapter.RollbackTransaction();
                    throw;                    
                }
                try
                {
                    adpBod_Alta.Adapter.BeginTransaction();
                    p_Proceso = "PEN";
                    DEL.BOD.DO_Bod_Alta.Delete_Orden(s, ref p_Objeto_);
                    Bod_Alta p_Objeto_Actual = CopiarObjeto(p_Objeto_);
                    List<Bod_Alta> lstBodAlta = adpBod_Alta.GetById(s, p_Objeto_.Id);
                    p_Objeto_.Fecha_Update = lstBodAlta[0].Fecha_Update;
                    p_Objeto_Actual.Estado = p_Proceso;
                    p_Objeto_Actual.Fecha_Update = DateTime.Now;
                    if (Actualizar(s, p_Objeto_, p_Objeto_Actual))
                    {
                        p_Objeto_ = p_Objeto_Actual;
                    }
                    adpBod_Alta.Adapter.CommitTransaction();
                }
                catch 
                {
                    adpBod_Alta.Adapter.RollbackTransaction();
                    throw;                   
                }
            }
            else if (p_Objeto_.Estado == "ORD" && p_Proceso == "PEN")
            {
                try
                {
                    adpBod_Alta.Adapter.BeginTransaction();
                    DEL.BOD.DO_Bod_Alta.Delete_Orden(s, ref p_Objeto_);
                    Bod_Alta p_Objeto_Nuevo = CopiarObjeto(p_Objeto_);
                    p_Objeto_Nuevo.Estado = p_Proceso;
                    p_Objeto_Nuevo.Fecha_Update = DateTime.Now;
                    if (Actualizar(s, p_Objeto_, p_Objeto_Nuevo))
                    {
                        p_Objeto_ = p_Objeto_Nuevo;
                    }
                    adpBod_Alta.Adapter.CommitTransaction();
                }
                catch 
                {
                    adpBod_Alta.Adapter.RollbackTransaction();
                    throw;                    
                }
            }
            return true;
        }


        public object GetById(Scope s, string p_Id)
        {
            List<Bod_Alta> resultado = new List<Bod_Alta>(1);
            try
            {
                resultado = adpBod_Alta.GetById(s, p_Id);
            }
            catch
            {
                EmitirExcepcion(TXT_Mensajes._MSJ47, p_Id);
            }

            if (resultado.Count == 0)
                EmitirExcepcion(TXT_Mensajes._MSJ47, p_Id);

            return resultado[0];
        }



        public bool Actualizar(Scope s, object p_Objeto_Original, object p_Objeto)
        {
            Bod_Alta v_Objeto_Original_ = (Bod_Alta)p_Objeto_Original;
            Bod_Alta v_Objeto_ = (Bod_Alta)p_Objeto;
            int estadoId = adpBod_Alta.Update(s, v_Objeto_, v_Objeto_Original_);
            return true;
        }

        public bool Permiso(Scope s, object p_Objeto, string p_Proceso)
        {
            throw new NotImplementedException();
        }


        private Bod_Alta CopiarObjeto(Bod_Alta p_Objeto)
        {
            Bod_Alta nuevoObjeto = new Bod_Alta(p_Objeto);         
            return nuevoObjeto;
        }

        #endregion
    }
}
